﻿HmJS.$Import('log');
HmJS.$Import('util.array.base');

HmJS.register('demo.module.types.arrayquicksort', function ($) {
	var that = {};

//	var i = items.length % 8;
//	while (i) {
//		process(items[i--]);
//	};
//	i = Math.floor(items.length / 8);
//	while (i) {
//		process(items[i--]);
//		process(items[i--]);
//		process(items[i--]);
//		process(items[i--]);
//		process(items[i--]);
//		process(items[i--]);
//		process(items[i--]);
//		process(items[i--]);
//	};

	function random(m, n) {
		//生成一个m、n之间的整数 
		var i = Math.random();
		return Math.round((n - m) * i + m);
	}

	function getRandomArr(m, n, l) {
		//m：生成随即整数的最小值，n：生成随即整数的最大值，l：生成的数组的长度 
		var resultArr = [];
		for (var i = 0; i < l; i++) {
			resultArr.push(random(m, n))
		}
		return resultArr;
	}

	var sortIntF = function (a, b) { return a - b; }
	var compare = function (v1, v2) {
		if (typeof v1 === 'string') { v1 = v1.toLowerCase() }
		if (typeof v2 === 'string') { v2 = v2.toLowerCase() }
		if (v1 == v2) { return 0; }
		else if (v1 < v2) { return -1; }
		else { return 1; }
	}

	that.pk = function (num) {
		//num: 用于排序的数组的元素个数 
		//生成用于排序的数组 
		var arr = getRandomArr(1, 999999, num);
		//当元素个数小于10000时，执行n次取平均值 
		var n = Math.ceil(10000 / num);
		//生成多个用于排序的数组的拷贝 
		var sortArrs = [];
		var quickSortArrs = [];
		var quickSortNumArrs = [];
		for (var i = 0; i < n; i++) {
			sortArrs.push(arr.slice(0));
			quickSortArrs.push(arr.slice(0));
			quickSortNumArrs.push(arr.slice(0));
		}
		var t1 = new Date();
		for (var i = 0; i < n; i++) {
			sortArrs[i].sort(sortIntF);
		}
		var t2 = new Date();
		for (var i = 0; i < n; i++) {
			quickSortArrs[i].quickSort(compare);
		}
		var t3 = new Date();
		for (var i = 0; i < n; i++) {
			quickSortNumArrs[i].quickSort();
		}
		var t4 = new Date();
		log.info("性能比较，对于" + num + "个元素的数组，平均每次排序花费时间如下：\n"
						+ "Array.prototype.sort：" + ((t2 - t1) / n) + "ms\n"
						+ "quickSort：" + ((t3 - t2) / n) + "ms\n"
						+ "quickSortNum：" + ((t4 - t3) / n) + "ms\n");
		log.info("排序结果是否正确：" + (sortArrs[0].join() == quickSortNumArrs[0].join()));
	}

	return that;
});